package sifeap.pl.managedbean.reportes;

import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import sifeap.bl.ejb.reportes.ReporteBLLocal;
import sifeap.bl.ejb.solicitudesauxilio.SolicitudAuxilioBLLocal;
import sifeap.bl.ejb.solicitudesauxilio.TipoAuxilioBLLocal;
import sifeap.entities.solicitudesauxilio.EstadoAuxilio;
import sifeap.entities.solicitudesauxilio.TipoAuxilio;
import sifeap.entities.solicitudesauxilio.valueobject.SolicitudAuxilioVO;
import sifeap.exception.SifeapException;
import sifeap.pl.managedbean.usuarios.LoginManagedBean;
import sifeap.pl.util.FacesUtils;
import sifeap.util.Util;

@ManagedBean(name="reporteAuxilioManagedBean")
@SessionScoped
public class ReporteAuxilioManagedBean {
	private SolicitudAuxilioVO solicitudAuxilioVo;
	
	private List<String> tiposSeleccinados;
	private List<String> estadosSeleccinados;
	
	private final String MENSAJES_BUNDLE = "sifeap.pl.bundles.mensajes";
	
	@EJB
	private ReporteBLLocal reporteBL;
	
	@EJB
	private SolicitudAuxilioBLLocal solicitudAuxilioBL;
	
	@EJB
	private TipoAuxilioBLLocal tipoAuxilioBL;

	@PostConstruct
	public void inicializar() {
		cargarDatosPredeterminados();
	}
	
	public SolicitudAuxilioVO getSolicitudAuxilioVo() {
		return solicitudAuxilioVo;
	}

	public void setSolicitudAuxilioVo(SolicitudAuxilioVO solicitudAuxilioVo) {
		this.solicitudAuxilioVo = solicitudAuxilioVo;
	}
	
	public List<String> getTiposSeleccinados() {
		return tiposSeleccinados;
	}

	public void setTiposSeleccinados(List<String> tiposSeleccinados) {
		this.tiposSeleccinados = tiposSeleccinados;
	}

	public List<String> getEstadosSeleccinados() {
		return estadosSeleccinados;
	}

	public void setEstadosSeleccinados(List<String> estadosSeleccinados) {
		this.estadosSeleccinados = estadosSeleccinados;
	}
	
	public List<SelectItem> getItemsTiposAuxilio() {
		List<TipoAuxilio> listaTipoAuxilio;
		List<SelectItem> itemsTiposAuxilio = new ArrayList<SelectItem>();
		try {
			listaTipoAuxilio = tipoAuxilioBL.buscarTodos();
			if (listaTipoAuxilio != null) {
				for (TipoAuxilio tipoAuxilio : listaTipoAuxilio) {
					itemsTiposAuxilio.add(new SelectItem(String.valueOf(tipoAuxilio.getIdTipoAuxilio()), tipoAuxilio.getNombre()));
				}
			}
		} catch (SifeapException e) {
			e.printStackTrace();
		}
		return itemsTiposAuxilio;
	}

	public List<SelectItem> getItemsEstadosAuxilio() {
		List<EstadoAuxilio> listaEstadoAuxilio;
		List<SelectItem> itemsEstadosAuxilio = new ArrayList<SelectItem>();
		try {
			listaEstadoAuxilio = solicitudAuxilioBL.buscarEstadosAuxilio();
			if (listaEstadoAuxilio != null) {
				for (EstadoAuxilio estadoAuxilio : listaEstadoAuxilio) {
					itemsEstadosAuxilio.add(new SelectItem(String.valueOf(estadoAuxilio.getIdEstadoAuxilio()), estadoAuxilio.getNombre()));
				}
			}
		} catch (SifeapException e) {
			e.printStackTrace();
		}
		return itemsEstadosAuxilio;
	}
	
	private void cargarDatosPredeterminados() {
		//Inicializa los objetos
		setSolicitudAuxilioVo(new SolicitudAuxilioVO());
		tiposSeleccinados = null;
		estadosSeleccinados = null;
	}
	
	public void generarReporte() {
		try {
			if (getSolicitudAuxilioVo().getFechaInicio() != null && getSolicitudAuxilioVo().getFechaFin() != null
					&& getSolicitudAuxilioVo().getFechaFin().compareTo(getSolicitudAuxilioVo().getFechaInicio()) < 0) {
				try {
					FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.reportes.fechasnovalidas"), false);
				} catch (SifeapException em) {}
				return;
			}
			
			byte[] reporte = reporteBL.generarReporteSolicitudesAuxilio(getSolicitudAuxilioVo(), tiposSeleccinados, estadosSeleccinados);
			
			if (reporte != null) {
				FacesUtils.enviarAlNavegador(new ByteArrayInputStream(reporte), "ReporteSolicitudesAuxilio"+Util.obtenerCadenaFecha()+".pdf", true);
			} else {
				FacesUtils.addWarnMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.reportes.sinresultado"), false);
			}
		} catch (Exception e) {
			try {
				FacesUtils.addErrorMessage(FacesUtils.getMensaje(MENSAJES_BUNDLE, "sifeap.reportes.error"), false);
			} catch (SifeapException em) {}
			e.printStackTrace();
		}
	}
	
	public String limpiar() {
		cargarDatosPredeterminados();
		return "/web/reportes/solicitudesAuxilio.jsf?faces-redirect=true";
	}
	
	public boolean isTienePermisos() {
		return LoginManagedBean.tienePermisos("rep_auxilios:crear");
	}
}